/*
 * File    : DownloadManagerStats.java
 * Created : 22-Oct-2003
 * By      : stuff
 * 
 * Azureus - a Java Bittorrent client
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details ( see the LICENSE file ).
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package org.gudy.azureus2.core3.download;

/**
 * @author parg
 * 
 */
public interface DownloadManagerStats {
    /**
     * Find out percentage done of current state
     * <P>
     * Use getDownloadCompleted() if you wish to find out a torrents download completion level
     * 
     * @return 0 to 1000, 0% to 100% respectively When state is Allocating, Checking, or Initializing, this returns the % done of that task Any other
     *         state MAY return getDownloadCompleted()
     */
    public int getCompleted();

    /**
     * Retrieve the level of download completion.
     * <P>
     * To understand the bLive parameter, you must know a bit about the Torrent activation process:<BR>
     * 1) Torrent goes into ST_WAITING<BR>
     * 2) Torrent moves to ST_PREPARING<BR>
     * 3) Torrent moves to ST_DOWNLOADING or ST_SEEDING
     * <P>
     * While in ST_PREPARING, Completion Level is rebuilt (either via Fast Resume or via piece checking). Quite often, the download completion level
     * before ST_PREPARING and after ST_PREPARING are identical.
     * <P>
     * Before going into ST_PREPARING, we store the download completion level. If you wish to retrieve this value instead of the live "building" one,
     * pass false for the parameter.
     * 
     * @param bLive
     *            true - Always returns the known completion level of the torrent
     *            <P>
     *            false - In the case of ST_PREPARING, return completion level before of the torrent ST_PREPARING started. Otherwise, same as true.
     * 
     * @return 0 - 1000
     */
    public int getDownloadCompleted(boolean bLive);

    public void setDownloadCompleted(int completed);

    /**
     * Get the total number of bytes ever downloaded.
     * 
     * @return total bytes downloaded
     */
    public long getTotalDataBytesReceived();

    /**
     * data bytes received minus discards and hashfails
     * 
     * @return
     */

    public long getTotalGoodDataBytesReceived();

    public long getTotalProtocolBytesReceived();

    public long getSessionDataBytesReceived();

    /**
     * Get the total number of bytes ever uploaded.
     * 
     * @return total bytes uploaded
     */
    public long getTotalDataBytesSent();

    public long getTotalProtocolBytesSent();

    public long getSessionDataBytesSent();

    /**
     * Resets the total bytes sent/received - will stop and start the download if it is running
     */
    public void resetTotalBytesSentReceived(long sent, long received);

    /**
     * Returns the bytes remaining. Excludes DND files only if there is a DiskManager!
     */
    public long getRemaining();

    public long getDiscarded();

    public long getHashFailBytes();

    public long getHashFailCount();

    /**
     * Gives the share ratio of the torrent in 1000ths (i.e. 1000 = share ratio of 1)
     */
    public int getShareRatio();

    public void setShareRatio(int ratio);

    public long getDataReceiveRate();

    public long getProtocolReceiveRate();

    public long getDataSendRate();

    public long getProtocolSendRate();

    /**
     * Swarm speed
     * 
     * @return
     */
    public long getTotalAverage();

    /**
     * Average for a peer in the swarm
     * 
     * @return
     */
    public long getTotalAveragePerPeer();

    /**
     * In general history isn't available, however if this method is called it will start retention for a certain period of time
     * 
     * @return
     */

    public void setRecentHistoryRetention(boolean required);

    /**
     * Get any recent history. Returned values are send rate, receive rate and peer-swarm average
     * 
     * @return
     */

    public int[][] getRecentHistory();

    public String getElapsedTime();

    // in ms
    public long getTimeStarted();

    /* -1 if not seeding */
    public long getTimeStartedSeeding();

    /**
     * Returns the ETA time in seconds. 0 = download is complete. < 0 = download is complete and it took -xxx time to complete. -1 = unknown eta (no
     * peer manager) or download completed 1s ago Constants.CRAPPY_INFINITE_AS_LONG = incomplete and 0 average speed
     */

    /**
     * *deprecated - use getSmoothedETA as the unstability of getETA is pretty bad
     * 
     * @return
     */
    public long getETA();

    public long getSmoothedETA();

    public long getPeakDataReceiveRate();

    public long getPeakDataSendRate();

    public long getSmoothedDataReceiveRate();

    public long getSmoothedDataSendRate();

    public float getAvailability();

    public long getSecondsDownloading();

    public long getSecondsOnlySeeding();

    public void setCompleted(int c);

    /**
     * Get the max upload rate allowed for this download.
     * 
     * @return upload rate in bytes per second, 0 for unlimited, -1 for upload disabled
     */
    public int getUploadRateLimitBytesPerSecond();

    /**
     * Set the max upload rate allowed for this download.
     * 
     * @param max_rate_bps
     *            limit in bytes per second, 0 for unlimited, -1 for upload disabled
     */
    public void setUploadRateLimitBytesPerSecond(int max_rate_bps);

    /**
     * Get the max download rate allowed for this download.
     * 
     * @return download rate in bytes per second, 0 for unlimited, -1 for download disabled
     */
    public int getDownloadRateLimitBytesPerSecond();

    /**
     * Set the max download rate allowed for this download.
     * 
     * @param max_rate_bps
     *            limit in bytes per second, 0 for unlimited, -1 for download disabled
     */
    public void setDownloadRateLimitBytesPerSecond(int max_rate_bps);

    public int getTimeSinceLastDataReceivedInSeconds();

    public int getTimeSinceLastDataSentInSeconds();

    public long getAvailWentBadTime();

    public long getBytesUnavailable();

    /*
     * public long getEstimatedDownloaded(); public long getEstimatedUploaded();
     */

    public void restoreSessionTotals(long _saved_data_bytes_downloaded, long _saved_data_bytes_uploaded, long _saved_discarded,
            long _saved_hashfails, long _saved_SecondsDownloading, long _saved_SecondsOnlySeeding);

    public long getRemainingExcludingDND();

    public long getSizeExcludingDND();

    public int getPercentDoneExcludingDND();

}
